在 rails 裡,你可以透過你的 models 跟資料庫發出請求取得你的資料,你可以用 ActiveRecord methods 像是 where, find, find_by。
find_by 會取得單筆資料或是 nil
where 方法允許取出符合條件的記錄,where 即代表了 SQL 語句的 WHERE 部分。條件可以是字串、陣列、或是 Hash。
find 會找到第一筆符合的資料(通常是 id ),如果沒有找到資料會噴錯。
換句話說,如果你期望找到一筆資料( 特定的 user )使用 find_by,如果想要找到多筆資料( 多筆 users )使用 where。但是 where 有許多用法常常會讓新手困惑例如我。
用 where 發送請求的的目的就是要在資料庫裡面過濾資訊後拿到你要的資料,例如你可以請求多個條件符合你的需求。
Book.where(category: "Ruby", author: "Jesus Castello")
這樣會回傳同時符合類別跟作者的資料範圍。
如果你想看看哪些資料大於&小於你可以這樣做
Book.where("LENGTH(title) > 20")
如果你想要插入一個比較值,請服用下列方法Book.where("LENGTH(title) > :min", min: params[:min_length])
如果你想要看你設定的條件不是 true ,你就可以使用 where 加上 not 方法,例如:Book.where.not(category: "Java")
或者是Book.where.not(title: nil)
上面這個 where.not 的用法就會找到 book 的 title 不是 nil。
這裡介紹的是 where 與 or 方法取得兩個或以上符合條件的資料,你可以這樣用:Book.where(category: "Programming").or(Book.where(category: "Ruby"))
上面這個用法可以結合兩種請求
where 結合陣列的用法可以用來尋找多筆值Book.where(id: [1,2,3])
結合陣列的用法可以在同一個時間找到所有的 idSELECT "books".* FROM "books" WHERE "books"."id" IN (1, 2, 3)
你可以在 rails logs 裡面看到上面這個SQL請求語法
如果你需要尋找得值是與另一個 table 相關, joins 方法可以解決這個問題,例如:Book.joins(:comments).where(comments: { id: 2 })
使用這個請求你會找到所有的書,而那些書都帶有一個 id 是 2 的 comment,你也可以用字串表達Book.joins(:comments).where("comments.id = 2")
comment 是 table 的名稱, id 是 column 名稱。